#include <list>
#include <string>
#pragma once
using namespace std;
class Symbol{
    enum type{BUILT_IN,VAR,FUNC} kind;
    string name;
    void* value;
    int tmp;
public:
	Symbol(type t, string s, void* value);
    Symbol(type t, string s);
    Symbol(const Symbol & s);
    Symbol();
    ~Symbol();
    void backfillValue(void * v);
    void backfillTag(string tag);
    void backfillType();
    void backfilltmp(int i);
    void *getvalue();
    int gettmp();

};

class Exp{

};

class Exp_VarDefine: public Exp{
	string type;
	list<Symbol> *var_list;
public:
    Exp_VarDefine();
    Exp_VarDefine(string type);
	Exp_VarDefine(string type, list<Symbol>* var_list);
    Exp_VarDefine(Exp_VarDefine * t){
        this->type = t->type;
        this->var_list = t->var_list;
    }

};

class ExpBlock: public Exp{
    
};

class Func{
	Symbol *params;
	Symbol return_sym;
	ExpBlock block;
};


class Condition{
    ExpBlock block;
    string left;
    string right;
    enum type{GREATE,EQUAL,LESS} op;
public:
    Condition(string l, string r, string op);
    string temp();
};

class  Program{
    Func func;
};
